﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;

namespace rosata
{
    public static class CommonUtilities
    {
        /// <summary>
        /// scrive il log degli errori diviso per giorno
        /// </summary>
        /// <param name="stringa"></param>
        /// <param name="tipoLog"></param>
        /// <param name="funzione"></param>
        /// <param name="messaggio"></param>
        /// <param name="eccezzione"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public static void WriteLog(string tipoLog, string funzione, string messaggio, string user, string note, Exception eccezzione = null)
        {
            TextWriter tw = null;

            try
            {
                String path = "";

                path = "~/public/log/";

                if (!File.Exists(HttpContext.Current.Server.MapPath(path + "log-" + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year)))
                    tw = File.CreateText(HttpContext.Current.Server.MapPath(path + "log-" + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year));
                else
                    tw = new StreamWriter(HttpContext.Current.Server.MapPath(path + "log-" + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year), true);

                // Scrivo la riga 
                if (eccezzione != null)
                {
                    string messaggioEccezione = "";

                    if (eccezzione.InnerException != null)
                        messaggioEccezione = eccezzione.InnerException.Message + " ";

                    tw.WriteLine(tipoLog + " | " + DateTime.Now.ToString("g") + " | " + user + " | " + funzione + " | " + messaggio + " | " + messaggioEccezione + " | " + note + " | ");
                }

                else
                    tw.WriteLine(tipoLog + " | " + DateTime.Now.ToString("g") + " | " + user + " | " + funzione + " | " + messaggio + " | " + note + " | ");

            }
            finally
            {
                // chiudo la scrittura del log
                if (tw != null)
                    tw.Close();
            }
        }

        /// <summary>
        /// invia una email a tutti gli indirizzi specificati in []address, questa email viene inviata dalla casella di posta info@conip.it
        /// </summary>
        /// <param name="address">array di stringhe contenenti gli indirizzi a cui inviare l'email</param>
        /// <param name="subject">oggetto della email</param>
        /// <param name="message">mesaggio della email</param>
        static public void SendMail(List<String> address, String subject, String message)
        {
            try
            {
                MailMessage mailMsg = new MailMessage
                {
                    IsBodyHtml = true,
                    From = new MailAddress("elevioleerboristeria@gmail.com")
                };

                //aggiungo le email ai destinatari TO
                foreach (String email in address)
                    mailMsg.To.Add(new MailAddress(email));

                //imposto oggetto, soggetto e html body
                mailMsg.Subject = subject;
                mailMsg.Body = message;
                mailMsg.IsBodyHtml = true;

                //imposto client SMTP
                SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 587);
                NetworkCredential credential = new NetworkCredential("elevioleerboristeria@gmail.com", "sitoerboristeria");
                smtpClient.Credentials = credential;
                smtpClient.EnableSsl = true;

                //e Procedo con l'invio
                smtpClient.Send(mailMsg);
            }
            catch (Exception exception)
            {
                WriteLog("ERRORE", "SendMail", "errore in fase di invio email" + exception.Message, "", "", exception);
            }
        }
        
        /// <summary>
        /// da un modelstate con errori ritorna una stringa contenente degli errori
        /// </summary>
        /// <param name="modelStateDictionary"></param>
        /// <returns></returns>
        static public string GetModelErrorStringFromModelState(ModelStateDictionary modelStateDictionary)
        {
            string errori = "";
            foreach (ModelState model in modelStateDictionary.Values)
            {
                foreach (ModelError error in model.Errors)
                {
                    errori += error.ErrorMessage;
                }
            }
            return errori;
        }

        /// <summary>
        /// dal modelstate ritorna l'elenco degli errori
        /// </summary>
        /// <param name="modelStateDictionary"></param>
        /// <returns></returns>
        static public List<ModelError> GetModelErrorsFromModelStateDictionary(ModelStateDictionary modelStateDictionary)
        {
            List<ModelError> listaModelErrors = new List<ModelError>();

            foreach (ModelState model in modelStateDictionary.Values)
            {
                foreach (ModelError error in model.Errors)
                {
                    listaModelErrors.Add(error);
                }
            }

            return listaModelErrors;
        }
    }
}
